home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 1 / QRZ Ham Radio Callsign Database - December 1993.iso / ucsd / packet / tcpip / sys5 / iscwmpst.z / iscwmpst / tcp / isc-src / convers / convers.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-10-29  |  3.9 KB  |  164 lines

  1. static char  rcsid[] = "@(#) $Header: convers.c,v 1.7 89/05/03 20:14:27 dk5sg Exp $";
  2.  
  3. #include <sys/types.h>
  4.  
  5. #include <signal.h>
  6. #include <stdio.h>
  7. #include <sys/socket.h>
  8. #include <termio.h>
  9. #include <time.h>
  10.  
  11. extern char  *getenv();
  12. extern char  *optarg;
  13. extern int  optind;
  14. extern struct sockaddr *build_sockaddr();
  15. extern void exit();
  16. extern void perror();
  17.  
  18. static struct termio prev_termio;
  19.  
  20. /*---------------------------------------------------------------------------*/
  21.  
  22. #if (defined(HPUX)||defined(BSD))
  23. static void sigpipe_handler(sig, code, scp) 
  24. int  sig, code; 
  25. struct sigcontext *scp;
  26.   scp->sc_syscall_action = SIG_RETURN; 
  27. #endif
  28. /*---------------------------------------------------------------------------*/
  29.  
  30. static void stop(arg)
  31. char  *arg;
  32. {
  33.   if (arg) perror(arg);
  34.   ioctl(0, TCSETA, &prev_termio);
  35.   exit(0);
  36. }
  37.  
  38. /*---------------------------------------------------------------------------*/
  39.  
  40. main(argc, argv)
  41. int  argc;
  42. char  **argv;
  43. {
  44. #if (defined(HPUX)||defined(BSD))
  45.   char  *server = "unix:/tcp/sockets/convers";
  46. #else
  47.   char  *server = "*:3600";
  48. #endif
  49.   char  buffer[2048];
  50.   char  c;
  51.   char  inbuf[2048];
  52.   char  outbuf[2048];
  53.   int  addrlen;
  54.   int  ch;
  55.   int  channel = 0;
  56.   int  echo;
  57.   int  errflag = 0;
  58.   int  i;
  59.   int  incnt = 0;
  60.   int  mask;
  61.   int  outcnt = 0;
  62.   int  size;
  63.  
  64. #if (defined(HPUX)||defined(BSD))
  65.   struct sigvec vec; 
  66. #endif
  67.   struct sockaddr *addr;
  68.   struct termio curr_termio;
  69.  
  70. #if (defined(HPUX)||defined(BSD))
  71.   vec.sv_mask = vec.sv_flags = 0; 
  72.   vec.sv_handler = sigpipe_handler; 
  73.   sigvector(SIGPIPE, &vec, (struct sigvec *) 0);
  74. #endif
  75.  
  76.   if (ioctl(0, TCGETA, &prev_termio)) stop(*argv);
  77.   if (ioctl(0, TCGETA, &curr_termio)) stop(*argv);
  78.   echo = curr_termio.c_lflag & ECHO;
  79.   curr_termio.c_lflag = 0;
  80.   curr_termio.c_cc[VMIN] = 1;
  81.   curr_termio.c_cc[VTIME] = 0;
  82.   if (ioctl(0, TCSETA, &curr_termio)) stop(*argv);
  83.  
  84.   while ((ch = getopt(argc, argv, "c:s:")) != EOF)
  85.     switch (ch) {
  86.     case 'c':
  87.       channel = atoi(optarg);
  88.       break;
  89.     case 's':
  90.       server = optarg;
  91.       break;
  92.     case '?':
  93.       errflag = 1;
  94.       break;
  95.     }
  96.  
  97.   if (errflag || optind < argc || !(addr = build_sockaddr(server, &addrlen))) {
  98.     fprintf(stderr, "usage: convers [-c channel] [-s host:service]\n");
  99.     stop(0);
  100.   }
  101.  
  102.   close(3);
  103.   if (socket(addr->sa_family, SOCK_STREAM, 0) != 3) stop(*argv);
  104.   if (connect(3, addr, addrlen)) stop(*argv);
  105.  
  106.   sprintf(inbuf, "/NAME %s %d\n", getenv("LOGNAME"), channel);
  107.   if (write(3, inbuf, (unsigned) strlen(inbuf)) < 0) stop(*argv);
  108.  
  109.   for (; ; ) {
  110.     mask = 011;
  111.     select(4, &mask, 0, 0, (struct timeval *) 0);
  112.     if (mask & 1) {
  113.       do {
  114.     if ((size = read(0, buffer, sizeof(buffer))) <= 0) stop(0);
  115.     for (i = 0; i < size; i++) {
  116.       c = buffer[i];
  117.       if (c == '\r') c = '\n';
  118.       if (c == prev_termio.c_cc[VERASE]) {
  119.         if (incnt) {
  120.           incnt--;
  121.           if (echo && write(1, "\b \b", 3) < 0) stop(*argv);
  122.         }
  123.       } else if (c == prev_termio.c_cc[VKILL]) {
  124.         for (; incnt; incnt--)
  125.           if (echo && write(1, "\b \b", 3) < 0) stop(*argv);
  126.       } else if (echo && c == 18) {
  127.         if (write(1, "^R\n", 3) < 0) stop(*argv);
  128.         if (write(1, inbuf, (unsigned) incnt) < 0) stop(*argv);
  129.       } else {
  130.         inbuf[incnt++] = c;
  131.         if (echo && write(1, &c, 1) < 0) stop(*argv);
  132.       }
  133.       if (c == '\n' || incnt == sizeof(inbuf) - 1) {
  134.         if (*inbuf == '!') {
  135.           inbuf[incnt] = '\0';
  136.           if (ioctl(0, TCSETA, &prev_termio)) stop(*argv);
  137.           system(inbuf + 1);
  138.           if (ioctl(0, TCSETA, &curr_termio)) stop(*argv);
  139.           if (write(1, "!\n", 2) < 0) stop(*argv);
  140.         } else {
  141.           if (write(3, inbuf, (unsigned) incnt) < 0) stop(*argv);
  142.         }
  143.         incnt = 0;
  144.       }
  145.     }
  146.       } while (incnt);
  147.     } else {
  148.       size = read(3, buffer, sizeof(buffer));
  149.       if (size <= 0) stop(0);
  150.       for (i = 0; i < size; i++) {
  151.     c = buffer[i];
  152.     if (c != '\r') outbuf[outcnt++] = c;
  153.     if (c == '\n' || outcnt == sizeof(outbuf)) {
  154.       if (write(1, outbuf, (unsigned) outcnt) < 0) stop(*argv);
  155.       outcnt = 0;
  156.     }
  157.       }
  158.     }
  159.   }
  160. }
  161.  
  162.